trivago
意外的查到的資料不多,所以這篇僅擷取Rails REARDME.md來簡單翻譯一下。
常常在跑rail時,都會遇到一些很奇怪的狀況導致migration, rails sever, rails db:seed等跑不出來這狀況,但只要下了spring stop
通常就解了?
Rails在4.1版本後新增了srping stop
功能,來看看rails guide寫什麼:
Spring 會預加載你的 Rails 應用程式。保持應用程式在背景執行,如此一來在執行 Rails 命令時:如跑測試、rake、migrate 時,不用每次都重啟 Rails 應用程式,加速你的開發流程。
簡單來說就是應用程式預加載器,就像加速器一樣的概念。
建立一個新的Rails專案並執行rails generate scaffold post name:string
打開終端機測試一下
$ time bin/rake test test/controllers/posts_controller_test.rb
Running via Spring preloader in process 2734
Run options:
# Running tests:
.......
Finished tests in 0.127245s, 55.0121 tests/s, 78.5887 assertions/s.
7 tests, 10 assertions, 0 failures, 0 errors, 0 skips
real 0m2.165s
user 0m0.281s
sys 0m0.066s
跑的速度不算特別快,因為是第一次執行這個專案,所以花的時間會比較長
來看一下spring的狀態:
$ bin/spring status
Spring is running:
26150 spring server | spring-demo-app | started 3 secs ago
26155 spring app | spring-demo-app | started 3 secs ago | test mode
再跑一次就可以發現速度快很多:
$ time bin/rake test test/controllers/posts_controller_test.rb
Running via Spring preloader in process 8352
Run options:
# Running tests:
.......
Finished tests in 0.176896s, 39.5714 tests/s, 56.5305 assertions/s.
7 tests, 10 assertions, 0 failures, 0 errors, 0 skips
real 0m0.610s
user 0m0.276s
sys 0m0.059s
在coding時做的變更,會根據你在更新哪個檔案去判別是否要重新啟動後台。
舉例來說當我們修改application file或是test file時,相關的變更會再下一次執行時變更,你只需要重新刷瀏覽器,但後台系統不必重新啟動。
但當如果我們修改啟動應用程式所需的檔案,例如:configs, initializers, gemfile時,則後台需要重新啟動應用程式,而且會自動執行。
例如編輯config/application.rb
:
$ touch config/application.rb
$ bin/spring status
Spring is running:
26150 spring server | spring-demo-app | started 36 secs ago
26556 spring app | spring-demo-app | started 1 sec ago | test mode
spring會偵測到config底下有檔案被更新後,就會自動啟動。
也許是spring的關係,所以常常會將我們不需要的東西先預載入到後台,導致我們在執行migration, rails s等會發生問題,所以才會需要下spring stop
來終止預先載入的行為。
這只是我的推測...如果有錯的話歡迎指正。
參考資料:
Rails/spring/REARDME.md
Ruby on Rails 4.1 發佈記
“If you really want something, you have to be prepared to work very hard, take advantage of opportunity, and above all never give up.”
— Jane Goodall, Ethologist
本文同步發佈於: https://louiswuyj.tw/